﻿using System;
using BLToolkit.Data;
using BLToolkit.DataAccess;
using BLToolkit.Mapping;
using Devsoft.DB.Models;
using Devsoft.DB.Models.Flat;

namespace Platform.Model
{
    [TableName("Employee")]
    public class Employee : ModelWithIdAndManager<Employee, EmployeeManager>
    {
        /// <summary>
        /// Tên đăng nhập cho nhân viên
        /// </summary>
        public string Username { get; set; }

        /// <summary>
        /// Mật khẩu đăng nhập
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// Họ và tên lót nhân viên
        /// </summary>
        public string FirstName { get; set; }

        /// <summary>
        /// Tên nhân viên
        /// </summary>
        public string LastName { get; set; }

        /// <summary>
        /// Địa chỉ nhân viên
        /// </summary>
        public string Address { get; set; }

        /// <summary>
        /// Điện thoại nhân viên
        /// </summary>
        public string Tel { get; set; }

        /// <summary>
        /// Tình trạng Active của Username 
        /// </summary>
        public bool Status { get; set; }

        /// <summary>
        /// Thời điểm đăng nhập cuối cùng
        /// </summary>
        public DateTime? LastLogin { get; set; }

        /// <summary>
        /// Thời điểm cập nhật lần cuối cùng
        /// </summary>
        public DateTime? LastUpdated { get; set; }

        /// <summary>
        /// Mã chức vụ của nhân viên
        /// </summary>
        public int RoleId { get; set; }

		/// <summary>
		/// Lay ho ten day du cua nhan vien
		/// </summary>
		/// 
		[MapIgnore]
		public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } }

        /// <summary>
        /// Thông tin về chức vụ nhân viên
        /// </summary>
        [Association(ThisKey = "RoleId", OtherKey = "Id", CanBeNull = false)]
        public Role Role { get; set; }
    }

	/// <summary>
	/// Lop DataAccessor de goi va thuc thi cac thu tuc lien quan toi Employee
	/// </summary>
    public abstract class EmployeeManager: Manager<Employee>
    {
		public EmployeeManager(DbManager dbManager)
			: base(dbManager)
        {
        }

		/// <summary>
		/// Goi thu tuc CheckLogin de kiem tra nguoi dung dang nhap.
		/// Tra ve doi tuong Employee neu dang nhap thanh cong
		/// </summary>
		/// <param name="Username">Ten dang nhap</param>
		/// <param name="Password">Mat khau</param>
		/// <returns>Tra ve Employee neu dang nhap thanh cong, null neu nguoc lai</returns>
        public abstract Employee CheckLogin(string Username, string Password);

        ///<summary>
        // Gọi thủ tục Kiểm tra những bảng liên quan có sử dụng mã Employee cho trước hay ko
        /// <param name="Id">Id nhân viên</param>
        /// <param name="Result">Kết quả trả về (bằng true nếu Id được dùng ở bảng khác và ngược lại</param>
        /// <returns>Trả về Result</returns>
        /// </summary>
        public abstract Employee Employee_CheckId(int Id, int Result);


        ///<summary>
        // Gọi thủ tục lấy danh sách nhân viên sắp xếp theo LastName, nếu trùng sắp xếp theo FirstName 
        /// <param name="Id">Id nhân viên</param>
        /// <returns>Trả về danh sách nhân viên</returns>
        /// </summary>

        public abstract Employee Employee_List();


        /// <summary>
        /// Gọi thủ tục Thêm nhân viên
        /// <param name="Username">Ten dang nhap</param>
        /// <param name="Password">Mat khau</param>
        /// <param name="FirstName">Họ và tên lót</param>
        /// <param name="LastName">Tên nhân viên</param>
        /// <param name="Address">Địa chỉ nhân viên</param>
        /// <param name="Status">Tình trạng Active username</param>
        /// <param name="LastLogin">Thời điểm đăng nhập lần cuối</param>
        /// <param name="LastLogin">Thời điểm update lần cuối</param>
        /// <param name="RoleId">Mã Role (Chức vụ)</param>
        /// </summary>
        public abstract Employee Employee_Insert(string Username, string Password, string FirstName, string LastName, string Address, string Tel, bool Status, DateTime LastLogin, DateTime LastUpdate, int RoleId);
        
        ///<summary>
        // Gọi thủ tục xóa nhân viên
        /// <param name="Id">Id nhân viên</param>
        /// </summary>
        public abstract Employee Employee_DeleteById(int Id);
    }
}

